/**
 * @fileOverview 这个文件是yijs的基础js，包含模板样式配置、常用函数等
 * @author 谢文浩
 * @version 0.111
 * {@link http:www.36ria.cn}
 * Copyright (c) 2009-2009 谢文浩
 */

/**
 * @namespace 
 * 命名空间
 */
yijs = {};

/**
 * @namespace 
 * yijs配置命名空间
yijs.config = {
		index : 1000,
		autoRender : false
};
 */

/**
 * 绝对定位层起始z-index
 */
yijs.ZINDEX = 1000;
yijs.form = {};
	
/**
 * 继承函数，使用原型继承
 * @param {Object} subClass    子类
 * @param {Object} superClass  父类
 */
yijs.extend = function(subClass,superClass){
	var F = function(){};
	F.prototype = superClass.prototype;
	subClass.prototype = new F();
	subClass.prototype.constructor = subClass;
	subClass.superClass = superClass.prototype;
	if(superClass.prototype.constructor == Object.prototype.constructor){
		superClass.prototype.constructor = superClass;
	}
}
/**
 * @description 鼠标经过、离开对象添加或移除特定样式
 * @param {Object} elm       所起作用的对象的css名
 * @param {Object} cls       添加或移除的样式
 * @param {Object} mouseover 鼠标经过时的回调函数
 * @param {Object} mouseout  鼠标离开时的回调函数
 */
yijs.hover = function(elm,cls,mouseover,mouseout){
		$(elm).hover(function(){
		       $(this).addClass(cls);
			   if(mouseover){mouseover.call(this);}
		},function(){
		       $(this).removeClass(cls);
			   if(mouseout){mouseout.call(this);}
		})		     
	
}

/**
 * @description 调用模板视图函数，非常关键的一个函数，很多类有用到,
 * 由于是基于jquery-jtemplates，所以有使用到模板的组件都要引入此插件，不然会报错
 * @requires jquery-jtemplates.js （http://jtemplates.tpython.com/）
 * @param {Object} options 
 */
yijs.view = function(options){
		var opt = {
			/**用于容纳模板解析成功后返回的html代码的容器对象的css名*/
			renderTo : options.renderTo || null,
			/**用于容纳模板解析成功后返回的html代码的容器对象*/
			$renderTo : options.$renderTo || null,
			/**模板数据源，为一对象字面量*/
			json     : options.json || null,
			/**模板数据源路径（ajax加载数据）*/
			jsonUrl  : options.jsonUrl || null,
			/**数据缓存*/
			jsonCache: options.jsonCache || true,
			/**模板html代码*/			
			tpl      : options.tpl || null,
			/**模板html代码路径（ajax加载模板）*/
			tplUrl   : options.tplUrl || null,
			/**模板缓存*/
			tplCache : options.tplCache || true,			
			target   : options.target || null,
			setting  : options.setting || null,
			/**错误信息*/					
			error    : false,
			/**监听事件
			 * @function processSuccess 模板处理成功后回调函数
			 * @function jsonBeforeSend json数据加载前 
			 * @function jsonSuccess    json数据成功加载后
			 * @function tplBeforeSend  模板数据加载前
			 * @function tplSuccess     模板数据成功加载后  
			 */
			listeners : options.listeners || {},
			/**模板参数源，为一对象字面量*/
			params : options.params || null			
		};
		
		finish(opt);
		function finish(opt){
			var $renderTo;
			if(opt.renderTo != null){
				$renderTo = $(opt.renderTo);
			}else{
				$renderTo = opt.$renderTo
			}
			if ((opt.json != null) && (opt.tpl != null) && (opt.error == false)) {
				yijs.view.setTpl($renderTo,opt.tpl);
				if(opt.params != null){
					$.each(opt.params,function(key,value){
						$renderTo.setParam(key,value);
					})
				}
				yijs.view.processTpl($renderTo,opt.json);
				if(opt.listeners.processSuccess){opt.listeners.processSuccess.call(this)};
			}
			//如果存在缓存，读取缓存的json与模板
			if ((opt.json == null) && (opt.jsonUrl != null) && (opt.jsonCache == true) && (yijs.view.cache.json[opt.jsonUrl])) {
				opt.json = yijs.view.cache.json[opt.jsonUrl];
			}
	        
			if ((opt.tpl == null) && (opt.tplUrl != null) && (opt.tplCache == true) && (yijs.view.cache.tpl[opt.tplUrl])) {
				opt.tpl = yijs.view.cache.tpl[opt.tplUrl];
			}
			//ajax读取json数据和模板
			if ((opt.jsonUrl != null) && (opt.json == null)) {
				$.ajax({
					url: opt.jsonUrl,
					dataType: "json",
					error: function() {
						opt.error = true;
						//finish(opt);
					},
					cache :false,
					beforeSend : function(){
						if(opt.listeners.jsonBeforeSend){opt.listeners.jsonBeforeSend.call(this)};
					},
					success: function(data) {
						if(opt.listeners.jsonSuccess){opt.listeners.jsonSuccess.call(this,data)};
						opt.json = data;
						if (opt.jsonCache) {
							yijs.view.cache.json[opt.jsonUrl] = data;
						}
						finish(opt);
					}
				});
		   }
		   
			if ((opt.tplUrl != null) && (opt.tpl == null) && (opt.json != null)) {
				$.ajax({
					url: opt.tplUrl,
					dataType: "html",
					error: function() {
						opt.error = true;
						//finish(opt);
					},
					cache :false,	
                   beforeSend : function(){
						if(opt.listeners.tplBeforeSend){opt.listeners.tplBeforeSend.call(this)};
					},
					success: function(data) {
						if(opt.listeners.tplSuccess){opt.listeners.tplSuccess.call(this,data)};
						opt.tpl = data;
						if (opt.tplCache) {
							yijs.view.cache.tpl[opt.tplUrl] = data;
						}
						finish(opt);
					}
				});
			}		   		
		}
}
yijs.view.processTpl = function($renderTo,d, param){
	return $renderTo.processTemplate(d);
}
yijs.view.hasTpl = function($renderTo){
	return $renderTo.hasTemplate();
}
yijs.view.setTpl = function($renderTo,s,includes,settings){
	return $renderTo.setTemplate(s,null,{runnable_functions: false});
}
yijs.view.cache = {
	tpl : {},
	json : {}
}


/**
 *所有UI的基类
 */
yijs.Ui = function(){
	
}
yijs.Ui.prototype = {
	render : function(){
		
	},
 	addItem : function(){
		/**
		 * 添加新的数据
		 */
	},
	addItemAt : function(){
		
	},
	addAll : function(){
		
	},
	addAllAt : function(){
		
	},
	getItemAt : function(){
		
	},
	refresh : function(){
		
	},
	removeAll : function(){
		
	},
	removeAllAt : function(){
		
	},
	removeItemAt : function(){
		
	},
	setItemAt : function(){
		
	},
	toArray : function(){
		
	},
	toString : function(){
		
	},
	clearFilter : function(){
		/**
		 * 清除过滤
		 */
	},
	filter : function(){
		/**
		 * 过滤
		 */
	},
	filterBy : function(){
		
	},
	find : function(){
		
	},
	findBy : function(){
		
	},
	/**
	 * 绑定事件
	 * @param {string} type
	 * @param {Object} fn
	 */
	bind : function(type,fn){
		this.listeners[type] = fn;
	},
	/**
	 * 移除事件
	 * @param {string} type
	 * @param {Object} fn
	 */
	unbind : function(type,fn){
		this.listeners[type] = null;
	}
}
 
 /**
  * 数据存储器
  */
 yijs.Collection = function(data){
	this.uis = [];
	this.source = data;
	this.length = this.source.length;
	
 }
 yijs.Collection.prototype = {
	 /**
	 * 添加子元素
	 * @param {Object|string} item
	 */	
 	addItem : function(item){
		if(this.uis.length > 0){
			this.source.push(item);
			this.length ++ ;
			for(var i=0;i<this.uis.length;i++){
				this.uis[i].addItem(item);
			}
		}
	},
	/**
	 * 添加子项到指定索引
	 * @param {number} index
	 * @param {Object|string} item
	 */	
	addItemAt : function(index,item){
		if(this.uis.length > 0){
			this.length ++ ;
			this.source.splice(index,0,item);
			for(var i=0;i<this.uis.length;i++){
				this.uis[i].addItemAt(index,item);
			}
		}		
	},
	/**
	 * 添加多条数据
	 * @param {array} items
	 */	
	addAll : function(items){
		if(this.uis.length > 0 && items.length>0){
			var itemsLeght = items.length;
			for(var i = 0;i<items.length;i++){
				this.source.push(items[i]);
			}
			this.length +=itemsLeght ;
			for(var i=0;i<this.uis.length;i++){
				this.uis[i].addAll(items);
			}
		}		
	},
	/**
	 * 插入多条数据到指定索引
	 * @param {number} index
	 * @param {array} items
	 */	
	addAllAt : function(index,items){
		if(this.uis.length > 0 && items.length>0){
			var itemsLeght = items.length;
			this.source.splice(index,0,items);
			this.length +=itemsLeght;
			for(var i=0;i<this.uis.length;i++){
				this.uis[i].addAllAt(index,items);
			}
		}			
	},
	/**
	 * 获取指定索引值的数据
	 * @param {number} index
	 */	
	getItemAt : function(index){
		if(this.uis.length > 0){
			return this.source[index];
		}
		return false;		
	},
	/**
	 * 删除所有数据
	 */	
	removeAll : function(){
		if(this.uis.length > 0){
			this.length = 0 ;
			this.source = [];
			for(var i=0;i<this.uis.length;i++){
				this.uis[i].removeAll();
			}
		}		
	},
	/**
	 * 删除指定索引的子项
	 * @param {number} index
	 */	
	removeItemAt : function(index){
		if(this.uis.length > 0){	
			for(var i=0;i<this.uis.length;i++){
				this.uis[i].removeItemAt(index);
			}
			var _arr = [];
			for(var i = 0;i<this.length;i++){
				i != index && _arr.push(this.source[i]);
			}
			this.source = _arr;
			this.length --;			
		}			
	},
	/**
	 * 修改指定索引值的数据
	 * @param {number} index
	 * @param {Object | string} item
	 */	
	setItemAt : function(index,item){
		if(this.uis.length > 0){
			this.source[index] = item;			
			for(var i=0;i<this.uis.length;i++){
				this.uis[i].setItemAt(index,item);
			}
		}		
	},
	toString : function(){
		
	},
	clearFilter : function(){
		/**
		 * 清除过滤
		 */
	},
	filter : function(){
		/**
		 * 过滤
		 */
	},
	filterBy : function(){
		
	},
	find : function(){
		
	},
	findBy : function(){
		
	},
	sort : function(){
		
	},
	/**
	 * 获取总行数
	 */	
	getCount : function(){
		return this.source.length;
	}
 }

yijs.getDocumentSize = function(){
	return [$(window).width(),$(document).height()];
}

/**
 * @description 鼠标经过、离开对象添加或移除特定样式
 * @param {Object} elm       所起作用的对象的css名
 * @param {Object} cls       添加或移除的样式
 * @param {Object} mouseover 鼠标经过时的回调函数
 * @param {Object} mouseout  鼠标离开时的回调函数
 */
yijs.hover = function(elm,cls,mouseover,mouseout){
		$(elm).hover(function(){
		       $(this).addClass(cls);
			   if(mouseover != null){mouseover.call(this);}
		},function(){
		       $(this).removeClass(cls);
			   if(mouseout != null){mouseout.call(this);}
		})		     
	
}
/**
 * 转换模板
 * @param {String} tpl 模板
 * @param {Array|String} arr 数据
 */
yijs.setTpl = function(tpl,arr){
	if(tpl && arr){
		if(typeof arr == "object" && arr.length > 0){
			$.each(arr,function(i){
				var n = "("+i+")";
				//var reg = new RegExp("/\{"+i+"\}/");
				tpl = tpl.replace(n,arr[i]);
			})			
		}else{
			var n = "(0)";
			tpl = tpl.replace(n,arr);
		}
		
	}
	return tpl;
}

